package org.univali.cg.bo;

import java.security.InvalidParameterException;

/**
 * 
 */
public class Matriz {
	private double[][] elementos;
	private int numLinhas;
	private int numColunas;
	
	public Matriz(int linhas, int colunas){
		numLinhas = linhas;
		numColunas = colunas;
		elementos = new double[numLinhas][numColunas];
	}
	
	public void print(){
		for (int i = 0; i < numLinhas; i++){
			System.out.print("[");
			for (int j = 0; j < numColunas; j++){
				System.out.print(elementos[i][j]);
				System.out.print(" ");
			}
			System.out.println("]");
		}
	}
	
	public void set(int i, int j, double x){
		elementos[i][j] = x;
	}
	
	public double get(int i, int j){
		return elementos[i][j];
	}
	
	public Matriz mais(Matriz B){
		Matriz C = new Matriz(numLinhas, numColunas);
		for (int i = 0; i < numLinhas; i++){
			for (int j = 0; j < numColunas; j++){
				double soma = this.get(i,j) + B.get(i,j);
				C.set(i, j, soma);
			}
		}
		return C;
	}

	/**
	 * Multiplica esta matriz por outra e retorna uma nova matriz com 
	 * o resultado desta multiplicação
	 * @param b matriz a ser multiplicada
	 * @return {@link Matriz} resultante da multiplicação desta pela matriz 
	 * passada por parâmetro
	 */
	public Matriz vezes(Matriz b) {
		
		// caso o objeto <code>b</code> seja nulo ou não tenha o número de 
		// colunas equivalente ao número de linhas deste objeto, não é possivel
		// realizar a multiplicação de matriz
		if(b == null || this.numColunas != b.numLinhas)
			throw new InvalidParameterException();
		
		Matriz resultado = new Matriz(this.numLinhas, b.numColunas);
		for(int i = 0; i < this.numLinhas; i++)
			for(int j = 0; j < b.numColunas; j++){
				resultado.elementos[i][j] = 0;
				
				for(int k = 0; k < this.numLinhas; k++){
					
					resultado.elementos[i][j] += 
						this.elementos[i][k] + b.elementos[k][j];
				}
			}
		return resultado;
	}	
	
	public int getNumLinhas() {
		return numLinhas;
	}

	public int getNumColunas() {
		return numColunas;
	}


	
}
